]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/brightness: Port to new MetaBacklight API
authorSebastian Wick <sebastian.wick@redhat.com>
Fri, 16 May 2025 15:24:48 +0000 (17:24 +0200)
committerMarge Bot <marge-bot@gnome.org>
Thu, 5 Jun 2025 20:38:39 +0000 (20:38 +0000)
Mutter has taken over controlling the backlights of the system from
gnome-settings-daemon. It now exposes MetaMonitors which can be reached
from MetaMonitorManager, and any of the MetaMonitors can have a
controllable backlight.

For now, we keep the current UX and simply set the backlight percentage
of the primary monitor's backlight (or the first monitor's backlight, if
the primary monitor doesn't have a backlight) on all monitors.

g-s-d is still responsible for reacting to keyboard shortcuts and
popping up the OSD notification, but that might change in the future.

The UI may change to make it possible to control individual backlights
in the future.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3715>

.gitlab-ci.yml
data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml [deleted file]
data/gnome-shell-dbus-interfaces.gresource.xml
js/ui/status/brightness.js

index 3db275ff3a957afa21701113ebd174aa38cb9c53..ed4684df2c9dde23bcc7a7a0f30354b35ef4386d 100644 (file)
@@ -40,7 +40,7 @@ default:
   image: $MUTTER_CI_IMAGE
 
 variables:
-  MUTTER_CI_IMAGE: registry.gitlab.gnome.org/gnome/mutter/fedora/42:x86_64-2025-05-16.0
+  MUTTER_CI_IMAGE: registry.gitlab.gnome.org/gnome/mutter/fedora/42:x86_64-2025-06-05.umockdev
   FDO_UPSTREAM_REPO: GNOME/gnome-shell
   BUNDLE: "extensions-git.flatpak"
   LINT_LOG: "eslint-report.xml"
diff --git a/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml b/data/dbus-interfaces/org.gnome.SettingsDaemon.Power.Screen.xml
deleted file mode 100644 (file)
index 05e4b8d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<node>
-  <interface name="org.gnome.SettingsDaemon.Power.Screen">
-    <property name="Brightness" type="i" access="readwrite"/>
-  </interface>
-</node>
index 586d85be6af24aa5b111cfe51e0eaec8f2ae629d..5005aa58d3a68a3e022cfca1346db14e5b80a2aa 100644 (file)
@@ -38,7 +38,6 @@
     <file preprocess="xml-stripblanks">org.gnome.SessionManager.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Color.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Power.Keyboard.xml</file>
-    <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Power.Screen.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Rfkill.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Wacom.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.Shell.AudioDeviceSelection.xml</file>
index ed6639460f3d20b68f3ffb8434fd567865928107..d1642f109ca22c60a7102e342e46a074b27253f5 100644 (file)
@@ -1,16 +1,7 @@
-import Gio from 'gi://Gio';
 import GObject from 'gi://GObject';
 
 import {QuickSlider, SystemIndicator} from '../quickSettings.js';
 
-import {loadInterfaceXML} from '../../misc/fileUtils.js';
-
-const BUS_NAME = 'org.gnome.SettingsDaemon.Power';
-const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
-
-const BrightnessInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Power.Screen');
-const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface);
-
 const BrightnessItem = GObject.registerClass(
 class BrightnessItem extends QuickSlider {
     _init() {
@@ -18,23 +9,19 @@ class BrightnessItem extends QuickSlider {
             iconName: 'display-brightness-symbolic',
         });
 
-        this._proxy = new BrightnessProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
-            (proxy, error) => {
-                if (error)
-                    console.error(error.message);
-                else
-                    this._proxy.connect('g-properties-changed', () => this._sync());
-                this._sync();
-            });
+        this.slider.accessible_name = _('Brightness');
+
+        const monitorManager = global.backend.get_monitor_manager();
+        monitorManager.connectObject('monitors-changed',
+            this._monitorsChanged.bind(this), this);
+        this._monitorsChanged();
 
         this._sliderChangedId = this.slider.connect('notify::value',
             this._sliderChanged.bind(this));
-        this.slider.accessible_name = _('Brightness');
     }
 
     _sliderChanged() {
-        const percent = this.slider.value * 100;
-        this._proxy.Brightness = percent;
+        this._setBrightness(this.slider.value);
     }
 
     _changeSlider(value) {
@@ -43,12 +30,49 @@ class BrightnessItem extends QuickSlider {
         this.slider.unblock_signal_handler(this._sliderChangedId);
     }
 
-    _sync() {
-        const brightness = this._proxy.Brightness;
-        const visible = Number.isInteger(brightness) && brightness >= 0;
-        this.visible = visible;
-        if (visible)
-            this._changeSlider(this._proxy.Brightness / 100.0);
+    _setBrightness(brightness) {
+        this._primaryBacklight?.block_signal_handler(this._brightnessChangedId);
+        this._monitors.forEach(monitor => {
+            const backlight = monitor.get_backlight();
+            const {brightnessMin: min, brightnessMax: max} = backlight;
+            backlight.brightness = min + ((max - min) * brightness);
+        });
+        this._primaryBacklight?.unblock_signal_handler(this._brightnessChangedId);
+
+        this._changeSlider(brightness);
+    }
+
+    _primaryBacklightChanged() {
+        const {brightness, brightnessMin: min, brightnessMax: max} =
+            this._primaryBacklight;
+        const target = (brightness - min) / (max - min);
+        this._setBrightness(target);
+    }
+
+    _setPrimaryBacklight(backlight) {
+        if (this._primaryBacklight) {
+            this._primaryBacklight.disconnect(this._brightnessChangedId);
+            this._brightnessChangedId = 0;
+        }
+
+        this._primaryBacklight = backlight;
+        this.visible = !!backlight;
+
+        if (this._primaryBacklight) {
+            this._brightnessChangedId =
+                this._primaryBacklight.connect('notify::brightness',
+                    this._primaryBacklightChanged.bind(this));
+            this._primaryBacklightChanged();
+        }
+    }
+
+    _monitorsChanged() {
+        this._monitors = global.backend.get_monitor_manager()
+            .get_monitors()
+            .filter(m => m.get_backlight() && m.is_active());
+        const primary = this._monitors.find(m => m.is_primary()) ||
+                        this._monitors[0];
+        this._setPrimaryBacklight(primary?.get_backlight());
     }
 });